<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>构造函数对象</title>
  </head>
  <body>
    <!-- 
        常见的创建对象的三种方式
        构造函数
        实例成员&静态成员

        1、通过字面量的方式进行创建  --- 常用的书写方式
        let a = { name : "佩奇" }

        2、通过 let o = new Object（{name : '佩奇'} ） ----- 这个是系统给我们构建的，我们可以通过自己的方式进行创建构造函数

        3、通过构造函数的方式进行创建
        ☆☆ 构造函数是一种特殊的函数，主要用来初始化快速创建对象
        使用场景：
            常规的{} 语法允许创建一个对象，比如我们创建了佩奇的对象，继承创建乔治的对象还需要重新写一遍，此时可以通过构造函数来快速
            创建多个类似的对象

            约定：以大写字母开头，创建时通过 new 关键字进行实例化
            
            构造函数内部不需要写return 返回的值就是新创建的新对象
        -->

    <script>
      // 实例化的执行过程
      // 当执行new 的时候到底发生了什么

      /*
          一共做了四步
          1、创建了一个新空对象， 对象绑定属性 __proto__ = 构造函数.prototype
          2、构造函数this指向新对象
          3、执行构造函数代码，修改this，添加新的属性，this是新的这个对象 
          4、返回新对象
        
        
        */

      function Pig(uname, age, sex) {
        this.uname = uname;
        this.age = age;
        this.sex = sex;
      }

      // 创建 只要写了一个 new 就会 创建一个新的空对象
      // 构造函数的this指向这个新的空对象
      // 然后执行里面的代码，将this修改添加上属性
      // 返回这个新的对象给peiqi
      let peiqi = new Pig("佩奇", 6, "女");
    </script>
  </body>
</html>
